package java模板模式;

/**
 * @author coderFu
 * @create 2022/3/4
 * 钩子方法模拟
 */
public abstract class HookFunction {

    /**
     * 最常见的使用，父类方法需要子类实现作为判断条件，就是子类控制
     * 父类行为。
     */

    /**
     * 钩子顾名思义就是用来挂东西的，所以需要一个被挂载的东西，
     * 一个挂载的东西
     */

    /**
     * 钩子的实现
     * 对于抽象方法或者接口中定义的一个空实现，在实际中的应用，比如一个接口
     * 这个接口有7个方法，而你只想用其中一个方法，那么此时，也可以写一个
     * 抽象类实现这个接口，在这个抽象类里将你要用的那个方法设置为abstract，
     * 其他方法进行空实现，然后你再继承这个抽象类，就不需要实现其它不用的方法
     *
     */

    /**
     * 挂载的钩子方法
     * @return
     */
    public abstract boolean isOpen();

    public final void operating(){

        if (isOpen()){
            System.out.println("钩子方法开启");
        }else {
            System.out.println("构造方法关闭");
        }
    }
}

class AchieveClass extends HookFunction{

    @Override
    public boolean isOpen() {
        return true;
    }

    /**
     * 只要重写 isOpen（）方法就能干扰业务流程，相当于一个钩子挂载
     * 在父类中
     * @param args
     */

    public static void main(String[] args) {

        /**
         * 实际应用
         * Runtime.getRuntime().addShutdownHook(shutdownHook);
         * 在jvm中增加一个关闭的钩子，当jvm关闭的时候，会先
         * 执行这些钩子，然后再关闭jvm
         */

        AchieveClass ac = new AchieveClass();
        ac.operating();
    }
}
